Delegates gebruiken
WerkenMetDelegates,
waarin we alle voorbeelden voor het leren werken met delegates, zullen plaatsen.Maak een WerkenMetDelegates
klasse in de CSharpLerenViaConsole
namespace.
namespace CSharpLerenViaConsole { class WerkenMetDelegates { public delegate string IntToStringVertegenwoordiger(); } }
En roep die op in de Main methode van de Program klasse zoals je dat met elke andere klasse zou doen:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharpLerenViaConsole { class Program { static void Main(string[] args) { DelegatesGebruiken(); Console.ReadKey(); } static void DelegatesGebruiken() { int x = 1021; WerkenMetDelegates.IntToStringVertegenwoordiger xToString = new WerkenMetDelegates.IntToStringVertegenwoordiger(x.ToString); Console.WriteLine("x to string: {0}", xToString()); } } }
Deze code instantieert een delegate van het type IntToStringVertegenwoordiger
en ïnitialiseert de delegate variable met een verwijzing naar de ToString
methode van
de integer variabele x
.
In C# aanvaarden delegates altijd een één-parameter-constructor.De parameter is dan de methode waarnaar de delegate verwijst. Deze methode moet overeekomen met de handtekening waarmee je de oorspronkelijk delegate gedefiniëerd hebt. Doe je dat met een methode met een andere handtekening krijg je een compilatie fout. Vermits int.ToString
een instantie methode en geen static methode is, moet je zowel de instantie (x) als de naam van de methode opgeven om de delegate te initialiseren.
Ronde haakjes toevoegen aan de delegate instantie is hetzelfde als het aanroepen van de Invoke
methode van de delegate klasse. Omdat xToString
een variabele van een type delegate is, vervangt de C# compiler xToString
door xToString.Invoke():
Console.WriteLine("x to string: {0}", xToString.Invoke());
Je kan ook gewoon de naam van het adres doorgeven i.p.v. van eerst een delegate instantie te maken:
WerkenMetDelegates.IntToStringVertegenwoordiger xToString = x.ToString; Console.WriteLine("x to string met adres: {0}", xToString.Invoke());
Dit is bekend onder de naam delegate inference. Deze C # functie werkt zo lang als de compiler een delegate instantie kan terug brengen naar een bepaalde type.